package com.ithema.controller;

import com.ithema.domain.Student;
import com.ithema.service.StudentService;

import java.text.ParseException;
import java.util.List;
import java.util.Scanner;

/*
    客服类:
        1. 接收用户请求
        2. 指挥业务员处理对应业务
        3. 将处理的结果响应给用户展示
 */
public abstract class BaseStudentController {

    public Scanner sc = new Scanner(System.in);
    private StudentService service = new StudentService();

    // 客服的功能入口
    public final void start() {
        while (true) {
            //1. 展示二级菜单列表
            System.out.println("********欢迎来到学生管理系统********");
            System.out.println("1. 添加学生");
            System.out.println("2. 删除学生");
            System.out.println("3. 修改学生");
            System.out.println("4. 查看学生");
            System.out.println("5. 退出");

            //2. 用户录入选项,匹配对应功能
            String option = sc.next();

            //3. 基于switch来进行菜单功能路由
            switch (option) {
                case "1":
                    addStudent();
                    break;
                case "2":
                    deleteStudent();
                    break;
                case "3":
                    updateStudent();
                    break;
                case "4":
                    findAllStudent();
                    break;
                case "5":
                    System.out.println("感谢使用学生管理系统,再见!");
                    return;  // return 结束的当前方法!
                default:
                    System.out.println("输入有误!");
                    break;
            }
        }
    }

    //客服类: 修改学生功能
    public final void updateStudent() {
        //1. 先判断一下系统中是否有数据,系统中没有数据,直接提示: 无信息,添加后重试!结束当前方法
        List<Student> allStudents = service.findAllStudent();
        if (allStudents == null) {
            System.out.println("无信息,请添加后重试!");
            return;
        }

        //2. 键盘录入要修改的学生信息
        System.out.println("请输入要修改的学生学号");
        String updateId = getInputStudentId(true);

        //2. 调用方法,封装学生对象
        Student newStu = getStudentInfo(updateId);

        //3. 指挥业务员进行修改学生业务
        boolean result = service.updateStudent(updateId, newStu);

        //4. 根据业务员返回的结果来展示对应结果信息给用户
        if (result) {
            System.out.println("修改成功");
        } else {
            System.out.println("修改失败: 请检查学号后重试!");
        }

    }

    //客服类: 删除学生功能
    public final void deleteStudent() {
        //1. 接收要删除的学生学号
        System.out.println("请输入要删除的学生学号:");
        String delId = sc.next();

        //2. 指挥业务员进行删除业务
        boolean result = service.deleteStudent(delId);

        //3. 根据业务员返回的结果来展示对应结果信息给用户
        if (result) {
            System.out.println("删除成功");
        } else {
            System.out.println("删除失败: 请检查学号后重试!");
        }
    }

    //客服类: 查看学生功能
    public final void findAllStudent() {
        //1. 指挥业务员对象进行查看学生的业务处理
        List<Student> allStudents = service.findAllStudent();
        /*
                allStudents = {null,null,null,null,null}    -- 期望service返回 null
                allStudents = {stu,stu,null,null,null}      -- 期望service返回 正常数组地址
         */
        //2.判断一下系统中是否有数据,没有数据则提示: 无信息,请添加后重试!有数据: 则展示数据
        if (allStudents == null) {
            System.out.println("无信息,请添加后重试!");
            return;
        }
        //3. 遍历数组, 展示学生信息
        System.out.println("学号\t\t姓名\t年龄\t生日");
        for (int i = 0; i < allStudents.size(); i++) {
            Student stu = allStudents.get(i);
            //对当前索引位置的元素进行非空校验
            if (stu != null) {
                System.out.println(stu.getId() + "\t" + stu.getName() + "\t" + stu.getAge() + "\t\t" + stu.getBirthday());
            }
        }
    }

    //客服类: 添加学生功能
    public final void addStudent() {
        //1. 键盘录入学生学号
        System.out.println("请输入学生学号:");
        String id = getInputStudentId(false);

        //2. 调用方法,封装学生对象
        Student stu = getStudentInfo(id);

        //3. 指挥业务员对象进行添加学生的业务处理
        boolean result = service.addStudent(stu);

        //4. 根据业务员返回的结果来展示提示信息给用户
        if (result) {
            System.out.println("添加成功!");
        } else {
            System.out.println("添加失败!");
        }
    }

    //封装一个方法: 键盘录入学生信息,封装学生对象并返回
    public abstract Student getStudentInfo(String id) ;

    //封装一个方法: 键盘录入一个可用学号并返回
    // flag: true ,表示调用者期望得到一个存在的学号
    // flag: false ,表示调用者期望得到一个不存在的学号
    public final String getInputStudentId(boolean flag){
        String id;
        while (true) {
            id = sc.next();
            boolean exists = service.isExists(id);
            if (exists == flag) {
                break;
            } else {
                System.out.println("当前学号不可用,请重新输入:");
            }
        }

        return id;
    }

}
